Next.jsãã©ã¬ã«ã«ãŒãã解説ãè€æ°ã®ç¬ç«ããã»ã¯ã·ã§ã³ã§åçãã€æè»ãªããŒãžã¬ã€ã¢ãŠããæ§ç¯ããããã®å æ¬çãªã¬ã€ããå®è£ ãå©ç¹ããã¹ããã©ã¯ãã£ã¹ã玹ä»ã
Next.jsãã©ã¬ã«ã«ãŒãïŒåçãªããŒãžã¬ã€ã¢ãŠãã®æ§ç¯
Next.jsã¯ãäž»èŠãªReactãã¬ãŒã ã¯ãŒã¯ãšããŠãææ°ã®Webã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®åŒ·åãªããŒã«ãéçºè ã«åžžã«æäŸããŠããŸããæè¿ã®ããŒãžã§ã³ã§å°å ¥ãããæããšããµã€ãã£ã³ã°ãªæ©èœã®1ã€ã¯ããã©ã¬ã«ã«ãŒãã§ãããã®æ©èœã䜿çšãããšãåãããŒãžã¬ã€ã¢ãŠãå ã§è€æ°ã®ç¬ç«ããã»ã¯ã·ã§ã³ãã¬ã³ããªã³ã°ã§ãããããã¢ããªã±ãŒã·ã§ã³ã®æ§é ãšãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæ¯é¡ã®ãªãæè»æ§ãšå¶åŸ¡ã§å®çŸã§ããŸãã
ãã©ã¬ã«ã«ãŒããšã¯ïŒ
åŸæ¥ãNext.jsã®ã«ãŒãã¯ãåäžã®ããŒãžã³ã³ããŒãã³ãã«å¯Ÿå¿ããŠããŸãããå¥ã®ã«ãŒãã«ç§»åãããšãããŒãžå šäœãåã¬ã³ããªã³ã°ãããŸãããã©ã¬ã«ã«ãŒãã¯ãåãã¬ã€ã¢ãŠãå ã§è€æ°ã®ã³ã³ããŒãã³ããåæã«ã¬ã³ããªã³ã°ãããããããç¬èªã®ç¬ç«ããã«ãŒãã»ã°ã¡ã³ãã«ãã£ãŠç®¡çãããããã«ããããšã§ããã®ãã©ãã€ã ãæã¡ç ŽããŸããããŒãžãåå¥ã®ã»ã¯ã·ã§ã³ã«åå²ãããããããç¬èªã®URLãšã©ã€ããµã€ã¯ã«ãæã¡ããã¹ãŠã1ã€ã®ç»é¢äžã«å ±åããŠãããšèããŠãã ããã
ããã«ãããããè€éã§åçãªãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãäœæããããã®å€ãã®å¯èœæ§ãéãããŸããããšãã°ããã©ã¬ã«ã«ãŒãã䜿çšããŠã次ã®ããšãã§ããŸãã
- ã¡ã€ã³ã³ã³ãã³ããšäžç·ã«æ°žç¶çãªããã²ãŒã·ã§ã³ããŒã衚瀺ããŸãã
- ã¡ã€ã³ããŒãžã®ãããŒã«åœ±é¿ãäžããã«ãã¢ãŒãã«ãŠã£ã³ããŠãŸãã¯ãµã€ãããŒãå®è£ ããŸãã
- åå¥ã«ããŒãããã³æŽæ°ã§ããç¬ç«ãããŠã£ãžã§ãããåããããã·ã¥ããŒããäœæããŸãã
- ããŒãžå šäœã®æ§é ã«åœ±é¿ãäžããããšãªããã³ã³ããŒãã³ãã®ããŸããŸãªããŒãžã§ã³ãA/Bãã¹ãããŸãã
ã³ã³ã»ããã®çè§£ïŒã¹ããã
ãã©ã¬ã«ã«ãŒãã®èåŸã«ããäžå¿çãªæŠå¿µã¯ããã¹ãããããšããæŠå¿µã§ããã¹ãããã¯ãç¹å®ã®ã«ãŒãã»ã°ã¡ã³ããã¬ã³ããªã³ã°ãããã¬ã€ã¢ãŠãå
ã®ååä»ãé åã§ãããããã®ã¹ãããã¯ãappãã£ã¬ã¯ããªã§@èšå·ã®åŸã«ã¹ãããåãä»ããŠå®çŸ©ããŸããããšãã°ã@sidebarã¯ãsidebarããšããååã®ã¹ãããã衚ããŸãã
åã¹ãããã¯ãã«ãŒãã»ã°ã¡ã³ãã«é¢é£ä»ããããšãã§ããŸãããŠãŒã¶ãŒãç¹å®ã®ã«ãŒãã«ç§»åãããšãNext.jsã¯ããã®ã«ãŒãã»ã°ã¡ã³ãã«é¢é£ä»ããããã³ã³ããŒãã³ããã¬ã€ã¢ãŠãå ã®å¯Ÿå¿ããã¹ãããã«ã¬ã³ããªã³ã°ããŸãã
å®è£ ïŒå®è·µçãªäŸ
ãã©ã¬ã«ã«ãŒããã©ã®ããã«æ©èœãããããå®è·µçãªäŸã§èª¬æããŸããããeã³ããŒã¹ã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããŠããŠãæ°žç¶çãªã·ã§ããã³ã°ã«ãŒããµã€ãããŒãåãã補å詳现ããŒãžã衚瀺ããããšããŸãã
1. ãã£ã¬ã¯ããªæ§é
ãŸããã¢ããªã±ãŒã·ã§ã³ã®ãã£ã¬ã¯ããªæ§é ãå®çŸ©ããŸãããã
app/
product/
[id]/
@cart/
page.js // ã·ã§ããã³ã°ã«ãŒãã³ã³ããŒãã³ã
page.js // 補å詳现ã³ã³ããŒãã³ã
layout.js // 補åã¬ã€ã¢ãŠã
layout.js // ã«ãŒãã¬ã€ã¢ãŠã
åãã¡ã€ã«ã衚ããã®ã¯æ¬¡ã®ãšããã§ãã
- app/layout.js: ã¢ããªã±ãŒã·ã§ã³å šäœã®ã«ãŒãã¬ã€ã¢ãŠãã
- app/product/[id]/layout.js: 補å詳现ããŒãžã«åºæã®ã¬ã€ã¢ãŠããããã«ã¹ããããå®çŸ©ããŸãã
- app/product/[id]/page.js: ã¡ã€ã³ã®è£œå詳现ã³ã³ããŒãã³ãã
- app/product/[id]/@cart/page.js: ã·ã§ããã³ã°ã«ãŒãã³ã³ããŒãã³ãã
@cartã¹ãããã«ã¬ã³ããªã³ã°ãããŸãã
2. ã«ãŒãã¬ã€ã¢ãŠãïŒapp/layout.jsïŒ
ã«ãŒãã¬ã€ã¢ãŠãã«ã¯éåžžãããããŒãããã¿ãŒãªã©ãã¢ããªã±ãŒã·ã§ã³å šäœã§å ±æãããèŠçŽ ãå«ãŸããŠããŸãã
// app/layout.js
export default function RootLayout({ children }) {
return (
ç§ã®Eã³ããŒã¹ã¢ããª
{children}
);
}
3. 補åã¬ã€ã¢ãŠãïŒapp/product/[id]/layout.jsïŒ
ããã¯ãã¹ããããå®çŸ©ããéèŠãªéšåã§ããã¡ã€ã³è£œåããŒãžãšã«ãŒãã®ã³ã³ããŒãã³ãã¯ãpage.jsãš@cart/page.jsã«ãããã察å¿ããpropsãšããŠåãåããŸãã
// app/product/[id]/layout.js
export default function ProductLayout({ children, cart }) {
return (
{children}
);
}
ãã®äŸã§ã¯ãåçŽãªãã¬ãã¯ã¹ããã¯ã¹ã¬ã€ã¢ãŠãã䜿çšããŠãã¡ã€ã³ã®è£œåã³ã³ãã³ããšã«ãŒããµã€ãããŒã䞊ã¹ãŠé
眮ããŠããŸããchildrenããããã£ã«ã¯ãapp/product/[id]/page.jsã®ã¬ã³ããªã³ã°ãããåºåãå«ãŸããcartããããã£ã«ã¯ãapp/product/[id]/@cart/page.jsã®ã¬ã³ããªã³ã°ãããåºåãå«ãŸããŸãã
4. 補å詳现ããŒãžïŒapp/product/[id]/page.jsïŒ
ããã¯ãidãã©ã¡ãŒã¿ã«åºã¥ããŠè£œåã®è©³çްã衚瀺ããæšæºçãªåçã«ãŒãããŒãžã§ãã
// app/product/[id]/page.js
export default async function ProductDetails({ params }) {
const { id } = params;
// IDã«åºã¥ããŠè£œåããŒã¿ãååŸ
const product = await fetchProduct(id);
return (
補å詳现
{product.name}
{product.description}
äŸ¡æ ŒïŒ${product.price}
);
}
async function fetchProduct(id) {
// å®éã®ããŒã¿ååŸããžãã¯ã«çœ®ãæããŸã
return new Promise(resolve => setTimeout(() => {
resolve({ id, name: `Product ${id}`, description: `Description of Product ${id}`, price: 99.99 });
}, 500));
}
5. ã·ã§ããã³ã°ã«ãŒãã³ã³ããŒãã³ãïŒapp/product/[id]/@cart/page.jsïŒ
ãã®ã³ã³ããŒãã³ãã¯ã·ã§ããã³ã°ã«ãŒãã衚ãã@cartã¹ãããã«ã¬ã³ããªã³ã°ãããŸãã
// app/product/[id]/@cart/page.js
export default function ShoppingCart() {
return (
ã·ã§ããã³ã°ã«ãŒã
ã«ãŒãå
ã®ã¢ã€ãã ïŒ3
);
}
説æ
ãŠãŒã¶ãŒã/product/123ã«ç§»åãããšãNext.jsã¯æ¬¡ã®åŠçãå®è¡ããŸãã
- ã«ãŒãã¬ã€ã¢ãŠãïŒ
app/layout.jsïŒãã¬ã³ããªã³ã°ããŸãã - 補åã¬ã€ã¢ãŠãïŒ
app/product/[id]/layout.jsïŒãã¬ã³ããªã³ã°ããŸãã - 補åã¬ã€ã¢ãŠãå
ã§ã補å詳现ã³ã³ããŒãã³ãïŒ
app/product/[id]/page.jsïŒãchildrenããããã£ã«ã¬ã³ããªã³ã°ããŸãã - åæã«ãã·ã§ããã³ã°ã«ãŒãã³ã³ããŒãã³ãïŒ
app/product/[id]/@cart/page.jsïŒãcartããããã£ã«ã¬ã³ããªã³ã°ããŸãã
çµæã¯ãåäžã®ã¬ã€ã¢ãŠãå ã«ã¬ã³ããªã³ã°ãããæ°žç¶çãªã·ã§ããã³ã°ã«ãŒããµã€ãããŒãåãã補å詳现ããŒãžã«ãªããŸãã
ãã©ã¬ã«ã«ãŒãã䜿çšããå©ç¹
- ãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã®åäžïŒæ°žç¶çãªèŠçŽ ãšåçãªã»ã¯ã·ã§ã³ãåãããããã€ã³ã¿ã©ã¯ãã£ãã§é åçãªãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãäœæããŸãã
- ã³ãŒãã®åå©çšæ§ã®åäžïŒã³ã³ããŒãã³ããšã¬ã€ã¢ãŠããããŸããŸãªã«ãŒãéã§ããç°¡åã«å ±æã§ããŸãã
- ããã©ãŒãã³ã¹ã®åäžïŒããŒãžå šäœãåã¬ã³ããªã³ã°ããå¿ èŠæ§ãæžãããªãããããŒãžã®ã»ã¯ã·ã§ã³ãåå¥ã«ããŒãããã³æŽæ°ããŸãã
- éçºã®ç°¡çŽ åïŒããã¢ãžã¥ãŒã«åãããæŽçãããæ§é ã§ãè€éãªã¬ã€ã¢ãŠããšã€ã³ã¿ã©ã¯ã·ã§ã³ã管çããŸãã
- A/Bãã¹ãæ©èœïŒããŒãžå šäœã«åœ±é¿ãäžããããšãªããç¹å®ã®ããŒãžã»ã¯ã·ã§ã³ã®ããŸããŸãªããªãšãŒã·ã§ã³ãç°¡åã«ãã¹ãã§ããŸãã
èæ ®äºé ãšãã¹ããã©ã¯ãã£ã¹
- ã«ãŒãã®ç«¶åïŒãã©ã¬ã«ã«ãŒãéã®ã«ãŒãã®ç«¶åãé¿ããããã«æ³šæããŠãã ãããåã«ãŒãã»ã°ã¡ã³ãã«ã¯ãåºæã®ç®çããããä»ã®ã»ã°ã¡ã³ããšéè€ããªãããã«ããå¿ èŠããããŸãã
- ã¬ã€ã¢ãŠãã®è€éãïŒãã©ã¬ã«ã«ãŒãã¯æè»æ§ãæäŸããŸãããé床ã«äœ¿çšãããšãä¿å®ãå°é£ãªè€éãªã¬ã€ã¢ãŠãã«ã€ãªããå¯èœæ§ããããŸããæè»æ§ãšã·ã³ãã«ãã®ãã©ã³ã¹ãç®æããŠãã ããã
- SEOãžã®åœ±é¿ïŒç¹ã«ç°ãªãã¹ãããã®ã³ã³ãã³ããå€§å¹ ã«ç°ãªãå Žåã¯ããã©ã¬ã«ã«ãŒãã䜿çšããããšã«ããSEOãžã®åœ±é¿ãèæ ®ããŠãã ãããæ€çŽ¢ãšã³ãžã³ãã³ã³ãã³ããé©åã«ã¯ããŒã«ããŠã€ã³ããã¯ã¹ãäœæã§ããããšã確èªããŠãã ãããã«ããã«ã«URLãé©åã«äœ¿çšããŸãã
- ããŒã¿ãã§ããïŒç¹ã«è€æ°ã®ç¬ç«ããã»ã¯ã·ã§ã³ãæ±ãå Žåã¯ãããŒã¿ãã§ãããæ éã«ç®¡çããŸããåé·ãªãªã¯ãšã¹ããåé¿ããããã«ãå ±æããŒã¿ã¹ãã¢ãŸãã¯ãã£ãã·ã¥ã¡ã«ããºã ã®äœ¿çšãæ€èšããŠãã ããã
- ã¢ã¯ã»ã·ããªãã£ïŒé害ã®ãããŠãŒã¶ãŒãå«ããã¹ãŠã®ãŠãŒã¶ãŒãããã©ã¬ã«ã«ãŒãã®å®è£ ã«ã¢ã¯ã»ã¹ã§ããããã«ããŸããé©åãªARIA屿§ãšã»ãã³ãã£ãã¯HTMLã䜿çšããŠãåªãããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸããŸãã
é«åºŠãªäœ¿çšæ³ïŒæ¡ä»¶ä»ãã¬ã³ããªã³ã°ãšåçã¹ããã
ãã©ã¬ã«ã«ãŒãã¯ãéçãªã¹ãããå®çŸ©ã«éå®ãããŸãããæ¡ä»¶ä»ãã¬ã³ããªã³ã°ãšåçã¹ãããã䜿çšããŠãããã«æè»ãªã¬ã€ã¢ãŠããäœæããããšãã§ããŸãã
æ¡ä»¶ä»ãã¬ã³ããªã³ã°
ãŠãŒã¶ãŒããŒã«ãèªèšŒã¹ããŒã¿ã¹ããŸãã¯ãã®ä»ã®èŠå ã«åºã¥ããŠãã¹ãããã«ç°ãªãã³ã³ããŒãã³ããæ¡ä»¶ä»ãã§ã¬ã³ããªã³ã°ã§ããŸãã
// app/product/[id]/layout.js
import { getUserRole } from '../../utils/auth';
export default async function ProductLayout({ children, cart }) {
const userRole = await getUserRole();
return (
{children}
);
}
function AdminPanel() {
return (
管çè
ããã«
ããã§è£œåã®è©³çްã管çããŸãã
);
}
ãã®äŸã§ã¯ããŠãŒã¶ãŒããadminãããŒã«ãæã£ãŠããå Žåãã·ã§ããã³ã°ã«ãŒãã®ä»£ããã«AdminPanelã³ã³ããŒãã³ãã@cartã¹ãããã«ã¬ã³ããªã³ã°ãããŸãã
åçã¹ããã
äžè¬çã§ã¯ãããŸããããã¹ãããåãåçã«æ§ç¯ããããšã¯çè«çã«ã¯*å¯èœ*ã§ãããè€éããšæœåšçãªããã©ãŒãã³ã¹ãžã®åœ±é¿ã®ãããäžè¬çã«ã¯æšå¥šãããŸãããå®çŸ©æžã¿ã®çè§£ããããã¹ãããã䜿çšããããšããå§ãããŸããåçãªãã¹ããããã®å¿ èŠæ§ãçããå Žåã¯ãããããã£ãšæ¡ä»¶ä»ãã¬ã³ããªã³ã°ãåããæšæºã®Reactã³ã³ããŒãã³ãã䜿çšãããªã©ã代æ¿ãœãªã¥ãŒã·ã§ã³ãæ€èšããŠãã ããã
å®äžçã®äŸãšãŠãŒã¹ã±ãŒã¹
ãã©ã¬ã«ã«ãŒããããŸããŸãªçš®é¡ã®ã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšã§ããå®äžçã®äŸãããã€ãèŠãŠã¿ãŸãããã
- eã³ããŒã¹ãã©ãããã©ãŒã ïŒè£œåã®è©³çްãŸãã¯ã«ããŽãªããŒãžãšäžç·ã«ãã·ã§ããã³ã°ã«ãŒããæšå¥šäºé ããŸãã¯ãŠãŒã¶ãŒã¢ã«ãŠã³ãæ å ±ã衚瀺ããŸãã
- ããã·ã¥ããŒãïŒã¡ããªãã¯ããã£ãŒããã¬ããŒãã衚瀺ããããã®ç¬ç«ãããŠã£ãžã§ãããåããããã·ã¥ããŒããäœæããŸããåãŠã£ãžã§ããã¯ãããã·ã¥ããŒãå šäœã«åœ±é¿ãäžããããšãªããåå¥ã«ããŒãããã³æŽæ°ã§ããŸããã»ãŒã«ã¹ããã·ã¥ããŒãã§ã¯ã1ã€ã®ãã©ã¬ã«ã«ãŒãã«å°ççãªããŒã¿ã衚瀺ããå¥ã®ãã©ã¬ã«ã«ãŒãã«è£œåã®ããã©ãŒãã³ã¹ã衚瀺ããŠããŠãŒã¶ãŒãããŒãžå šäœããªããŒãããã«è¡šç€ºããå 容ãã«ã¹ã¿ãã€ãºã§ããããã«ããããšãã§ããŸãã
- ãœãŒã·ã£ã«ã¡ãã£ã¢ã¢ããªã±ãŒã·ã§ã³ïŒã¡ã€ã³ãã£ãŒããŸãã¯ãããã¡ã€ã«ããŒãžãšäžç·ã«ããã£ãããµã€ãããŒãŸãã¯éç¥ããã«ã衚瀺ããŸãã
- ã³ã³ãã³ã管çã·ã¹ãã ïŒCMSïŒïŒç·šéäžã®ã³ã³ãã³ããšäžç·ã«ãã¬ãã¥ãŒãã€ã³ãŸãã¯ç·šéããŒã«ãæäŸããŸãããã©ã¬ã«ã«ãŒãã¯ãäœæäžã®èšäºã®ã©ã€ããã¬ãã¥ãŒã衚瀺ãã倿Žãè¡ããããšãªã¢ã«ã¿ã€ã ã§æŽæ°ã§ããŸãã
- åŠç¿ãã©ãããã©ãŒã ïŒã³ãŒã¹ææããé²æç¶æ³ã®è¿œè·¡ãŸãã¯ãœãŒã·ã£ã«ã€ã³ã¿ã©ã¯ã·ã§ã³æ©èœãšäžç·ã«è¡šç€ºããŸãã
- éèã¢ããªã±ãŒã·ã§ã³ïŒãã¥ãŒã¹èšäºãŸãã¯åæèšäºãšäžç·ã«ããªã¢ã«ã¿ã€ã ã®æ ªäŸ¡ãŸãã¯ããŒããã©ãªãªã®æŠèŠã衚瀺ããŸããéèãã¥ãŒã¹Webãµã€ãããã©ã¬ã«ã«ãŒãã䜿çšããŠãéå ±ãã¥ãŒã¹èšäºãšäžç·ã«ã©ã€ãããŒã±ããããŒã¿ã衚瀺ãããŠãŒã¶ãŒã«éèç¶æ³ã®å æ¬çãªãã¥ãŒãæäŸããããšãæ³åããŠãã ããã
- ã°ããŒãã«ã³ã©ãã¬ãŒã·ã§ã³ããŒã«ïŒæ°žç¶çãªãããªäŒè°ãŸãã¯ãã£ããããã«ã䜿çšããŠãããã¥ã¡ã³ããŸãã¯ã³ãŒãã®åæç·šéãèš±å¯ããŸãããµã³ãã©ã³ã·ã¹ã³ããã³ãã³ãæ±äº¬ã®åæ£åãšã³ãžãã¢ãªã³ã°ããŒã ã¯ããã©ã¬ã«ã«ãŒãã䜿çšããŠåãèšèšããã¥ã¡ã³ãããªã¢ã«ã¿ã€ã ã§æäœãããããªé話ããµã€ãããŒã«æ°žç¶çã«è¡šç€ºããã¿ã€ã ãŸãŒã³ãè¶ ããã·ãŒã ã¬ã¹ãªã³ã©ãã¬ãŒã·ã§ã³ãä¿é²ã§ããŸãã
çµè«
Next.jsãã©ã¬ã«ã«ãŒãã¯ãåçã§æè»ãªWebã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®æ°ããå¯èœæ§ãåãéã匷åãªæ©èœã§ããåãããŒãžã¬ã€ã¢ãŠãå ã§è€æ°ã®ç¬ç«ããã»ã¯ã·ã§ã³ãã¬ã³ããªã³ã°ã§ããããã«ããããšã§ããã©ã¬ã«ã«ãŒãã䜿çšãããšãããé åçãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãäœæããã³ãŒãã®åå©çšæ§ãé«ããéçºããã»ã¹ãç°¡çŽ åã§ããŸããæœåšçãªè€éããèæ ®ãããã¹ããã©ã¯ãã£ã¹ã«åŸãããšãéèŠã§ããããã©ã¬ã«ã«ãŒããç¿åŸãããšãNext.jsã®éçºã¹ãã«ãå€§å¹ ã«åäžããçã«é©æ°çãªWebã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããããã«ãªããŸãã
Next.jsãé²åãç¶ããã«ã€ããŠããã©ã¬ã«ã«ãŒãã¯ãWebäžã§å¯èœãªããšã®éçãæŒãåºããããšããŠããéçºè ã«ãšã£ãŠãŸããŸãéèŠãªããŒã«ã«ãªãããšã¯ééããããŸããããã®ã¬ã€ãã§æŠèª¬ãããŠããæŠå¿µã詊ããŠããã©ã¬ã«ã«ãŒããææ°ã®Webã¢ããªã±ãŒã·ã§ã³ã®æ§ç¯ã«å¯Ÿããã¢ãããŒããã©ã®ããã«å€ããããšãã§ããããçºèŠããŠãã ããã